<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\console\input\Argument;
use think\console\input\Option;
use app\command\model\CronTaskModel;

/**
 * 定时任务
 * @version 1.0.0-beta.220308
 * 主要功能：定时执行SQL；定时请求项目URL或外部URL；定时清空缓存；
 * 需要在 /config/console.php 文件增加内容选项：'task' => 'app\command\CronTask'
 * 说明：
 * 在线查看时间计划 https://tool.lu/crontab
 * 此功能需要结合Linux的Crontab才可以正常使用，可以定时执行一系列的操作。
 * Linux下使用 crontab -e -u 用户名 添加一条记录（每分钟执行1次）
 * 命令：* * * * * /usr/bin/php /www/yoursite/think autotask > /dev/null 2>&1 &
 * 命令列表：
 * php think task --status # 查看状态
 * php think task --stop # 手动停止任务
 * php think task --start # 手动启动任务
 * php think task --test # 人工测试（不受时间计划的限制，立即执行）
 * php think task --clear # 删除所有日志文件
 * php think task --logs # 显示所有日志文件列表
 * php think task --log="0830/15.log" # 显示日志文件内容
 */
// 示例：具体（每10分钟）：*/10 * * * * /usr/bin/php /www/admin/yoursite/think task > /dev/null 2>&1 &
// * * * * * /usr/bin/php /www/admin/mangheadmin_v1/think task > /dev/null 2>&1 &
class CronTask extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('crontask')
            ->addOption('status')
            ->addOption('stop')
            ->addOption('start')
            ->addOption('logs')
            ->addOption('log', null, Option::VALUE_OPTIONAL)
            ->addOption('clear')
            ->addOption('test')
            ->setDescription('the crontask command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        // $output->writeln('crontask');
        $taskModel=new CronTaskModel();
        // php think autotask --status # 查看状态
        if ($input->getOption('status')) {
            $taskModel->showStatus();
            return;
        }
        // php think autotask --stop # 手动停止任务
        if ($input->getOption('stop')) {
            $taskModel->stopTask();
            echo '任务已停止';
            return;
        }
        // php think autotask --start # 手动启动任务
        if ($input->getOption('start')) {
            $taskModel->startTask();
            echo '任务已启动';
            return;
        }
        // php think autotask --logs # 显示所有日志文件列表
        if ($input->getOption('logs')) {
            $taskModel->showLogs();
            return;
        }
        // php think autotask --log="0830/15.log" # 显示日志文件内容
        if ($input->getOption('log')) {
            $taskModel->showLog($input->getOption('log'));
            return;
        }
        // php think autotask --clear # 删除所有日志文件
        if ($input->getOption('clear')) {
            $taskModel->clearLog();
            return;
        }

        if ($taskModel->checkStop()) {
            $msg = '任务已停止运行，原因是：手动停止。';
            echo $msg;
            $taskModel->writeLog($msg);
            return;
        }
        // php think autotask --test # 人工测试（不受时间计划的限制，立即执行）
        $isTest=$input->getOption('test');
        // 指令输出
        echo 'autotask start at ', date('Y-m-d H:i:s'), PHP_EOL;
        $taskModel->writeLog('任务执行开始');
        // 上次运行时间
        file_put_contents($taskModel->lastExecFile, date('Y-m-d H:i:s'));
        // 开始执行任务
        $taskModel->run($isTest);
        echo PHP_EOL,'autotask finish at ', date('Y-m-d H:i:s'), PHP_EOL;
        $taskModel->writeLog('任务执行结束');
        // 上次成功运行时间
        file_put_contents($taskModel->lastExecSuccessFile, date('Y-m-d H:i:s'));
    }
}
